/**
 * @description 劫持数组，让其的方法可以被劫持到
 *
 */

const render = (action, ...args) => {
    console.log(`SET method=${action},args=${[...args].join(',')}`);
}

const oldPrototype = Array.prototype
const newPrototype = Object.create(oldPrototype); // 建立一个新的原型

['push', 'splice'].forEach(methodName => {
    newPrototype[methodName] = function (...args) {
        // 执行打印/劫持函数
        render(methodName, ...args)

        // 可以在这里使用老的原型直接执行
        oldPrototype[methodName].call(this, ...arguments)

        // 也可以返回返回老的原型上的方法，在下面执行
        // return oldPrototype[methodName]
    }
})


let reactive = (obj) => {
    if (Array.isArray(obj)) {
        // 如果是数组，直接修改原型链的指向
        obj.__proto__ = newPrototype
    }
}



let a = [1, 2]
reactive(a)
a.push(3) // SET method=push arg=3
console.log(a);
a.splice(0, 2)// SET method=splice arg=0,2
console.log(a);
a.splice(0, 0, 1, 2, 3, 4)
console.log(a);
a.splice(0, 0, [1, 2, 3, 4, 5])
console.log(a);